<?php
/**
 * 盘点作业
 * Created by PhpStorm.
 * User: echa
 * Date: 2018/2/5
 * Time: 14:37
 */
namespace App\Services\Warehouse;
class InventoryOperationService extends PublicService{
    public function __construct()
    {
        parent::__construct(Config('k3cloud.InventoryOperation'));
    }

    /**
     *单据列表查询
     * 1.data：Json格式数据（详情参考Json格式数据）（必录）
    1.1.FormId：业务对象表单Id（必录）
    1.2.FieldKeys：字段keys，字符串类型用逗号分隔，比如"key1,key2..."（必录）
    1.3.FilterString：过滤（非必录）  FNumber=''
    1.4.OrderString：排序字段（非必录）
    1.5.TopRowCount：总行数（非必录）
    1.6.StartRow：开始行（非必录）
    1.7.Limit：最大行数，不能超过2000（非必录）
     */
    public function ExecuteBillQueryInventoryOperation($FieldKeys='',$FilterString='',$OrderString='',$TopRowCount=0,$StartRow=0,$Limit=20)
    {
        if (empty($FieldKeys)) {
            $FieldKeys='FID,FBillNo,FStockOrgId,FSource,FCreatorId,FDocumentStatus,FCreateDate';
        }
        return $this->ExecuteBillQuery($FieldKeys,$FilterString,$OrderString,$TopRowCount,$StartRow,$Limit);
    }

    /**
     *   保存修改
     *1.formid：业务对象表单Id（必录）
    2.data：Json格式数据（详情参考Json格式数据）（必录）
    2.1.Creator：创建者名字（非必录）
    2.2.NeedUpDateFields：需要保存的字段,格式["fieldkey1","fieldkey2","entitykey1",...]，数组类型(非必录)
    2.3.NeedReturnFields：需要返回的结果字段,格式["fieldkey","entitykey.fieldkey",...]（非必录）
    2.4.IsDeleteEntry：是否删除分录，默认True删除（非必录）
    2.5.SubSystemId：菜单所在子系统Id（非必录）
    2.6.IsVerifyBaseDataField：是否验证所有的基础资料，默认False不验证（非必录）
    2.7.IsEntryBatchFill：是否批量填充分录：默认为Ture（非必录）
    2.8.Model：表单实体数据（必录）
     * */
    public function SaveInventoryOperation($arrdata=[]){
        $data=[
            "FID"=>"",
            "FBillTypeID"=>[
                "FNumber"=>""
            ],
            "FStockOrgId"=>[
                "FNumber"=>""
            ],
            "FNoteHead"=>"",
            "FDate"=>"1900-01-01",
            "FSource"=>"",
            "FBillEntry"=>[
                [
                    "FEntryID"=>"0",
                    "FStockId"=>[
                        "FNumber"=>""
                    ],
                    "FStockLocId"=>[

                    ],
                    "FMaterialId"=>[
                        "FNumber"=>""
                    ],
                    "FStockStatusId"=>[
                        "FNumber"=>""
                    ],
                    "FExtAuxUnitId"=>[
                        "FNumber"=>""
                    ],
                    "FLot"=>[
                        "FNumber"=>""
                    ],
                    "FUnitID"=>[
                        "FNumber"=>""
                    ],
                    "FAuxpropId"=>[

                    ],
                    "FCountQty"=>"0",
                    "FOwnerTypeId"=>"",
                    "FNote"=>"",
                    "FOwnerId"=>[
                        "FNumber"=>""
                    ],
                    "FKeeperTypeId"=>"",
                    "FKeeperId"=>[
                        "FNumber"=>""
                    ],
                    "FBomId"=>[
                        "FNumber"=>""
                    ],
                    "FMtoNo"=>"",
                    "FProduceDate"=>"1900-01-01",
                    "FExpiryDate"=>"1900-01-01",
                    "FExtAuxUnitQty"=>"0",
                    "FGainBillTypeId"=>[
                        "FNumber"=>""
                    ],
                    "FLossBillTypeId"=>[
                        "FNumber"=>""
                    ],
                    "FEntrySerial"=>[
                        [
                            "FDetailID"=>"0",
                            "FSerialNo"=>"",
                            "FStatus"=>"false",
                            "FSNNote"=>""
                        ]
                    ]
                ]
            ]
        ];
        return $this->save($data);
    }

    /**
    提交
     *
     * 1.formid：业务对象表单Id（必录）
    2.data：Json格式数据（详情参考Json格式数据）（必录）
    2.1.CreateOrgId：创建者组织，字符串类型（非必录）
    2.2.Numbers：单据编号集合，格式["billNo1","billNo1",...]，数组类型（必录）
     */

    public function  SubmitInventoryOperation($Numbers=[]){
        return $this->submit($Numbers);
    }

    /**
    审核
     * 1.formid：业务对象表单Id（必录）
    2.data：Json格式数据（详情参考Json格式数据）（必录）
    2.1.CreateOrgId：创建者组织，字符串类型（非必录）
    2.2.Numbers：单据编号集合，格式["billNo1","billNo1",...]，数组类型（必录）
     */
    public function AuditInventoryOperation($Numbers=[]){
        return $this->audit($Numbers);
    }


    /***
     * 根据盘点方案来源单号查询对应盘点物料作业单
     * @param string $Numbers
    @author echa
     * @return array|mixed
     * FID  单据ID
     * FBillNo 单据编号
     * FSchemeNo 盘点来源编码
     * FStockId.FNumber 仓库编号
     * FStockId.FName  仓库名称
     * FOwnerTypeId 货主类型
     * FOwnerId.FNumber  货主编号
     * FBillEntry_FEntryID 表体内码ID
     * FMaterialId.FNumber 物料编号
     * FMaterialId.FName 物料名称
     * FAcctQty 账存数量
     */
    public function ViewSourceGoodsInventoryOperation($Numbers=''){
        if(empty($Numbers)){
            return false;
        }
        $FieldKeys='FID,FBillNo,FSchemeNo,FStockId.FNumber,FStockId.FName,FOwnerTypeId,FOwnerId.FNumber,FOwnerId.FName,FBillEntry_FEntryID,FMaterialId.FNumber,FMaterialId.FName,FAcctQty';
        $FilterString="FSchemeNo='".$Numbers."'";
        return $this->ExecuteBillQuery($FieldKeys,$FilterString);
    }

    /***
     * 更新物料盘点作业单实物盘点数值
     * @param array $arrdata
    @author echa
     * @return array|bool
     */
    public function UpdateInventoryOperation(array $arrdata){
        if(empty($arrdata['FID'] || empty($arrdata['FBillNo']))){
            return false;
        }
        $goods=$this->UpdatePostGoodsDate($arrdata['goodsdata']);
        if(!$goods){
            return false;
        }
        $data=[
            "FID"=>$arrdata['FID'],
            "FBillNo"=>$arrdata['FBillNo'],
            "FNoteHead"=>$arrdata['FNoteHead'],
            "FBillEntry"=>$goods
        ];
        return $this->save($data);
    }

    /***
     * 遍历物料盘点作业单表体实物盘点数值
     * @param $goodsdata
    @author echa
     * @return array|bool
     */
    public function UpdatePostGoodsDate($goodsdata){
        if(count($goodsdata)<=0){
            return false;
        }
        $goods=array();
        foreach ($goodsdata as $k=>$v){
            $goods[]=[
                'FEntryID'=>$v['fentryid'],
                'FCountQty'=>$v['fcountqty']
            ];
        }
        return $goods;
    }


    /***
     * 更新物料盘点作业对应物料实物盘点数量并且提交审核
     * @param array $arrdata
    @author echa
     * @return array|bool
     */
    public function UpdateInventoryOperationAndSubmitAndAudit(array $arrdata){
        $data=$data=[
            "FID"=>$arrdata['FID'],
            "FBillNo"=>$arrdata['FBillNo'],
            "FNoteHead"=>$arrdata['note'],
            "goodsdata"=>$arrdata['goodsdata']
        ];
        $return=$this->UpdateInventoryOperation($data);
        if(!$return){
            return false;
        }
        if(empty($return['Id'])){
            return false;
        }
        $submitreturn=$this->SubmitInventoryOperation([$arrdata['FBillNo']]);
        if(empty($submitreturn['Id'])){
            return false;
        }
        $auditreturn=$this->AuditInventoryOperation([$arrdata['FBillNo']]);
        if(empty($auditreturn['Id'])){
            return false;
        }
        return $auditreturn;
    }

}